<html>
<head>
<title>CpcPaChi</title>
</head>
<body bgcolor="#FFFFFF">
<h2>Un compilador sencillo paso a paso</h2>
<p>Voy a hacer un peque&ntilde;o proyecto para estas vacaciones: un compilador sencillo. <br>
    <br>
  No soy ning&uacute;n experto en creaci&oacute;n de compiladores, y por eso ser&aacute; un compilador sencillo y lo har&eacute; paso a paso. Quiz&aacute; estos pasos ayuden a alguien m&aacute;s a entender un poco c&oacute;mo funcionan estas herramientas, as&iacute; que los dejar&eacute; disponibles aqu&iacute;. <br>
  <br>
M&aacute;s detalles: </p>
<ul>
  <li>Quiero crear el compilador en un lenguaje "razonablemente f&aacute;cil de leer" (y por tanto de depurar) y que est&eacute; disponible para muchas plataformas. Por eso usar&eacute; el lenguaje C#, que est&aacute; disponible para muchos sistemas operativos gracias al <a href="http://www.mono-project.com">proyecto Mono</a>. (Las primeras versiones usaban Pascal como lenguaje " anfitri&oacute;n ", en concreto, Free Pascal para Windows).  </li>
  <li>Se tratar&aacute; de un compilador de lenguaje Pascal (realmente, de un lenguaje "parecido a Pascal"). Nuevamente por facilidad de lectura y de depuraci&oacute;n (aunque en la nueva versi&oacute;n, creada en C#, se pierde la posibilidad de que alg&uacute;n d&iacute;a el compilador se pueda "compilar a s&iacute; mismo"). </li>
  <li>En cuanto a esa m&aacute;quina de destino , tiene que ser un sistema "razonablemente sencillo", pero considero m&aacute;s motivador usar un sistema real que un sistema "inventado". Por eso, usar&eacute; una arquitectura que a la vez es sencilla y f&aacute;cil de programar: un ordenador "cl&aacute;sico" de los a&ntilde;os 80, el Amstrad CPC , que usa un Z80 de 8 bits como procesador y que permite hacer muchas tareas de "alto nivel" mediante simples llamadas al firmware. </li>
</ul>
La mayor&iacute;a de libros de compiladores comienzan por crear un analizador l&eacute;xico, luego uno sint&aacute;ctico, y van ampliando sucesivamente hasta llegar a crear un compilador completo. Mi aproximaci&oacute;n va a ser radicalmente diferente. Con la esperanza de obtener algo "totalmente funcional" (aunque muy limitado) desde un primer momento, yo har&eacute; lo siguiente: <br>
<ul>
  <li>Crear un primer compilador que s&oacute;lo reconozca una orden muy simple, avise en caso de error y genere el c&oacute;digo de destino correspondiente. </li>
  <li>Ampliar para que reconozca tres &oacute;rdenes distintas, con par&aacute;metros sencillos, y las acepte en cualquier orden. </li>
  <li>Ampliar nuevamente para que fuerce a una estructura de programa concreta (el programa deber&aacute; comenzar por "program", el cuerpo deber&aacute; estar entre "begin" y "end", las &oacute;rdenes deber&aacute;n terminar en "punto y coma"). </li>
  <li>A&ntilde;adir la posibilidad de declarar y usar variables. </li>
  <li>Poder hacer comparaciones simples ("if"). </li>
  <li>A&ntilde;adir variables de m&aacute;s de un tipo (num&eacute;ricas, car&aacute;cter) y hacer las comprobaciones de tipo correspondientes. </li>
  <li>Permitir la creaci&oacute;n de procedimientos ("procedure"), que permitan crear programas modulares para la m&aacute;quina objetivo. </li>
  <li>... </li>
</ul>
<p>Estos son los pasos dados hasta la fecha: </p>
<p>Paso 1 - <a href="doc001.html">Reconocer la orden CLS y generar el c&oacute;digo correspondiente</a>. </p>
<p>Paso 2 - <a href="doc002.html">Reconocer la orden CLS, LOCATE y WRITECHAR, con par&aacute;metros, desde fichero</a>. </p>
<p>Paso 3 - <a href="doc003.html">Un primer analizador l&eacute;xico</a>. </p>
<p>Paso 4 - <a href="doc004.html">Un primer generador de c&oacute;digo independiente</a>. </p>
<p>Paso 5 - <a href="doc005.html">Un primer analizador sint&aacute;ctico</a>. </p>
<p>Paso 6 - <a href="doc006.html">Nuevas &oacute;rdenes</a>. </p>
<p>Paso 7 - <a href="doc007.html">Primera tabla de s&iacute;mbolos</a>. </p>
<p>Paso 8 - <a href="doc008.html">Mejorando el analizador l&eacute;xico</a>. </p>
<p>Paso 9 - <a href="doc009.html">Primer acercamiento a las variables</a>. </p>
<p>Paso 10 - <a href="doc010.html">Variables "utilizables"</a>. </p>
<p>Paso 11 - <a href="doc011.html">Saltos incondicionales</a>. </p>
<p>Paso 12 - <a href="doc012.html">Condiciones simples</a>. </p>
<p>Paso 13 - <a href="doc013.html">Estructuras repetivas</a>. </p>
<p>Paso 14 - <a href="doc014.html">Acercamiento a los procedimientos.</a>. </p>

<p><br />Tambi&eacute;n puedes conocer las <a href="doc_carencias.html">Carencias de la versi&oacute;n actual</a>. </p>

<p>Los pr&oacute;ximos cambios previstos est&aacute;n muy relacionados con esas carencias, y (sin garant&iacute;as de que se siga exactamente ese orden, como siempre) son:<br>
<ul>
  <li>Refinar algunas de las carencias y errores existentes. </li>
  <li>Permitir m&aacute;s tipos de datos (al menos &quot;integer&quot;, de 2 bytes de tama&ntilde;o)</li>
  <li>A&ntilde;adir m&aacute;s &oacute;rdenes de las que soporta el Firmware de los CPC, como las &oacute;rdenes de gr&aacute;ficos</li>
  <li>A&ntilde;adir m&aacute;s funciones predefinidas, al menos las necesarias para leer teclado y joystick</li>
  <li>Incluir un editor b&aacute;sico, que simplifique el proceso de edici&oacute;n, compilaci&oacute;n y (si procede) correcci&oacute;n</li>
  <li>Dar m&aacute;s alternativas en la generaci&oacute;n de c&oacute;digo destino: cargador Basic con comentarios, cargador Basic sin comentarios, fichero binario, quiz&aacute; incluso imagen de disco (fichero DSK).</li>  
  <li>Codigo generado m&aacute;s flexible: en distintas posiciones de memoria de destino, no necesariamente en la 30.000.</li>
  <li>Acercamiento al an&aacute;lisis de expresiones matem&aacute;ticas. </li>
  <li>A&ntilde;adir soporte de &quot;arrays&quot; y &quot;records&quot;</li>
  <li>Aplicar el proyecto un poco m&aacute;s a la variante &quot;l&uacute;dica&quot;: 
    a&ntilde;adir posibilidades
    b&aacute;sicas de gr&aacute;ficos y manejo de sprites, para que permita crear juegos
    sencillos para un CPC real. </li>
  <li>Posiblemente poco a poco se ir&aacute; acabando mi (escaso) tiempo libre 
    y me ir&aacute; siendo m&aacute;s dif&iacute;cil continuar el proyecto. Ser&aacute; el momento de aparcarlo
    o al menos de ralentizarlo mucho,
    as&iacute; que doy por sentado que no quedar&aacute; tan completo como me gustar&iacute;a.
    Aceptar&eacute; sugerencias y avisos
    de fallos, pero no garantizo que pueda ponerme con 
    ello... pero en el peor de los casos... el c&oacute;digo es abierto, los
    m&aacute;s atrevidos pueden mejorarlo ellos mismos.</li>
</ul>


</body>
</html>
